Authorization Code Grant
Front-channel communicationを使った方式
RFC6749 4.1
https://gyazo.com/b3653ab4355b08bc966c692631d25664
① Resource Owner(user)がClient (OAuth)にrequest
「自分の代わりに、他のサービスと連携してください」のような旨を伝える感じ
②Client (OAuth)がresponse
client目線では、userと認可サーバーがやり取りをして貰う必要がある
そのために、redirectするための情報を含めてresponse (302 Found)を返す
responseには以下の情報を含んだurlを返す
認可サーバーのurl
response_type=code
scope="read write"
OAuthのScope
client_id=client-1
redirect_uri=<clientのURL>
state=XXX
⑨で使う
/mrsekut-book-4798159298/098
③ userは認可サーバーのAuthorization Endpointに飛ばされる
認可request
②によってredirectし、認可サーバーにrequestを送る
②でclientから受け取った権限の要求を行う
redirectなので、②でclientから受け取った情報もそのまま認可サーバーに送ることになる
response_type=code
scope="read write"
client_id=client-1
redirect_uri=<clientのURL>
state=XXX
/mrsekut-book-4798159298/099
④⑤ 認可サーバーはuserに認証させる
認証の方法は仕様では決まっていないので何でも良い
e.g. password、証明書、etc.
ここでは④と⑤にしているが、実際は何回かやりとりがあるかもしれない 
ここの利点
clientがcredentialを知ることはない
ここの認証方法が代わっても、client/protected resourceの間に影響しない
⑥⑦ userは「clientを認可する」という旨を認証サーバーに伝える
OAuthのScopeの設定などを行う
どこまで権限を委譲するかを指定する
認証サーバーは、この指定を保存しておく
次回に同じような操作をする時に、⑥⑦のやりとりを省略できる
④⑤は省略できないが、⑥⑦は省略できる
⑧ 認証サーバーはuserにresponse (302 Found)を返す
Clientにrequestを送るようにredirectを返す
responseには以下の情報を含んだurlを返す
clientのurl
code=認可コード
state=XXX
②や③と全く同じ値のもの。⑨で使う
⑨ userはClientにredirect
認可response
⑧で認証サーバーから受け取ったものをそのままClientに渡す
code=認可コード
state=XXX
②で生成したstateの値と同じかどうかを確認するために使う
これでやっと、clientは認可コードを受け取ることができた
/mrsekut-book-4798159298/104
⑩ clientはToken Endpointに認可コードを付与してrequestを送る
token request
POSTで以下のものを送信
Authorization headerで、client_idとclient_secretを付与
BASIC認証する
code=認可コード
grand_type=authorization_code
⑪ 認可サーバーは認可コードを検証し、Access Tokenを生成しClientに返す
token response
認可コードが初めて使われたものなのかなども検証
認可サーバーは③~⑧らへんで、userとClientの情報を紐付けて保存しているので検証することができる
access_token
token_type
これでClientはAccess Tokenを得ることができた
⑫ clientはresourceにrequest
Access Tokenを使ってrequestを送信
bearrer認証など
これが本来の目的
認可サーバーとProtected Resourceでやり取りする部分が書かれていないなmrsekut.icon
User目線でのページ遷移
①でアクセスすると④(formなどのあるページ)が返ってくる
passを入力して⑤を送信して、⑥(認証しますか?のようなページ)が返ってくる
「認証します」を⑦で送信
これで終わり
裏で⑧~⑫が行われる感じになる
User目線ではかなり簡潔
/mrsekut-book-4798159298/095
/mrsekut-book-4798159298/675 (13.6 シンプルなOpenID Connectシステムの構築)
Authorization Code Grantに認証の仕組みを追加で実装する
https://youtu.be/PKPj_MmLq5E?t=2294